00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef DE_FILE_PRIV_HPP
00029 #define DE_FILE_PRIV_HPP
00030
00031 #include "deFileSystem_priv.hpp"
00032 #include "deGlobalTypes.hpp"
00033 #include "deFile.hpp"
00034 #include "dePlugins.hpp"
00035
00036
00037
00038
00039 class deFile;
00040 class deFileReal;
00041 class deFileVirtual;
00042 class deFilePlugin;
00043
00044
00045
00046
00047
00048
00049 class deFile : virtual public IdeFile
00050 {
00051 protected:
00052 deFile();
00053 virtual ~deFile();
00054
00055 public:
00056
00057
00058 int Release();
00059
00060
00061 void* GetInterface(IdeFile::interface_t i);
00062
00063
00064 virtual deBoolean Open(IdeFileSystem *BaseFS, char *Filename, long OpenFlags);
00065
00066
00067 virtual deBoolean Close();
00068
00069
00070 virtual long Read(void *Buffer, long Length);
00071 virtual long Write(void *Buffer, long Length);
00072
00073
00074 virtual long GetPosition();
00075 virtual long SetPosition(long NewPosition, IdeFile::Seek SeekType);
00076
00077
00078 virtual long GetSize();
00079 virtual deBoolean SetSize(long NewSize);
00080
00081
00082 virtual s64 GetTime();
00083 virtual deBoolean SetTime(s64 Time);
00084
00085
00086 virtual deBoolean GetProperties(deFileProperties *Properties);
00087
00088
00089 virtual long GetOpenFlags();
00090 };
00091
00092
00093 class deFileMemory : public deFile, public IdeFileMemory
00094 {
00095 public:
00096 deFileMemory();
00097 ~deFileMemory();
00098
00099
00100 int Release();
00101
00102 void* GetInterface(IdeFile::interface_t i);
00103
00104
00105
00106 deBoolean Open();
00107 deBoolean Open(long Length);
00108 deBoolean Open(void *Buffer, long Length);
00109 deBoolean Open(IdeFileSystem *BaseFS, char *Filename, long OpenFlags);
00110 deBoolean Open(IdeFile *BaseFile);
00111
00112
00113 deBoolean Close();
00114
00115
00116 long Read(void *Buffer, long Length);
00117 long Write(void *Buffer, long Length);
00118
00119
00120 long GetPosition();
00121 long SetPosition(long NewPosition, IdeFile::Seek SeekType);
00122
00123
00124 long GetSize();
00125 deBoolean SetSize(long NewSize);
00126
00127
00128 s64 GetTime();
00129 deBoolean SetTime(s64 Time);
00130
00131
00132 deBoolean GetProperties(deFileProperties *Properties);
00133
00134
00135 long GetOpenFlags();
00136
00137 private:
00138 BYTE * priv_Buffer;
00139 deBoolean priv_OwnBuffer;
00140 long priv_AllocSize;
00141 long priv_KnownSize;
00142 long priv_NewAllocSize;
00143 long priv_Position;
00144
00145 IdeFile * priv_BaseFile;
00146 IdeFileSystem * priv_BaseFS;
00147 long priv_OpenFlags;
00148 };
00149
00150
00151 class deFileVirtual : virtual public deFile, public IdeFileVirtual
00152 {
00153 protected:
00154 deFileVirtual();
00155
00156 deFSVirtual * priv_BaseFS;
00157 deFSVirtual::VirtualFileEntry * priv_CurrentFile;
00158
00159
00160 long priv_FileFlags;
00161 long priv_CurrentPosition;
00162
00163 friend class deFSVirtual;
00164
00165 public:
00166 ~deFileVirtual();
00167
00168
00169 int Release();
00170
00171 void* GetInterface(IdeFile::interface_t i);
00172
00173
00174 deBoolean Open(IdeFileSystem *BaseFS, char *Filename, long OpenFlags);
00175
00176
00177 deBoolean Close();
00178
00179
00180 long Read(void *Buffer, long Length);
00181 long Write(void *Buffer, long Length);
00182
00183
00184 long GetPosition();
00185 long SetPosition(long NewPosition, IdeFile::Seek SeekType);
00186
00187
00188 long GetSize();
00189 deBoolean SetSize(long NewSize);
00190 DWORD SetSize(long NewSize, deFSPROGRESS *StatusCallback);
00191
00192
00193 s64 GetTime();
00194 deBoolean SetTime(s64 Time);
00195
00196
00197 deBoolean GetProperties(deFileProperties *Properties);
00198
00199
00200 long GetOpenFlags();
00201 };
00202
00203
00204 class deFileReal : virtual public deFile, public IdeFileReal
00205 {
00206 protected:
00207 deFileReal();
00208
00209 #ifdef _WIN32
00210 HANDLE priv_FileHandle;
00211 #elif linux
00212 int priv_FileHandle;
00213 char priv_FilePath[256];
00214 #else
00215 #error("File Handle not supported for OS");
00216 #endif
00217
00218 long priv_OpenFlags;
00219 char priv_Filename[256];
00220
00221 friend class deFSReal;
00222
00223 public:
00224 ~deFileReal();
00225
00226
00227 int Release();
00228
00229 void* GetInterface(IdeFile::interface_t i);
00230
00231
00232 deBoolean Open(IdeFileSystem *BaseFS, char *Filename, long OpenFlags);
00233
00234
00235 deBoolean Close();
00236
00237
00238 long Read(void *Buffer, long Length);
00239 long Write(void *Buffer, long Length);
00240
00241
00242 long GetPosition();
00243 long SetPosition(long NewPosition, IdeFile::Seek SeekType);
00244
00245
00246 long GetSize();
00247 deBoolean SetSize(long NewSize);
00248
00249
00250 s64 GetTime();
00251 deBoolean SetTime(s64 Time);
00252
00253
00254 deBoolean GetProperties(deFileProperties *Properties);
00255
00256
00257 long GetOpenFlags();
00258 };
00259
00260
00261 class deFilePlugin : virtual public deFile, public IdeFilePlugin
00262 {
00263 public:
00264 deFilePlugin();
00265 ~deFilePlugin();
00266
00267
00268 int Release();
00269
00270 void* GetInterface(IdeFile::interface_t i);
00271
00272
00273 deBoolean Open(IdeFileSystem *BaseFS, char *Filename, long OpenFlags);
00274 deBoolean Open(IdeFile *BaseFile);
00275
00276
00277 deBoolean Close();
00278
00279
00280 long Read(void *Buffer, long Length);
00281 long Write(void *Buffer, long Length);
00282
00283
00284 long GetPosition();
00285 long SetPosition(long NewPosition, IdeFile::Seek SeekType);
00286
00287
00288 long GetSize();
00289 deBoolean SetSize(long NewSize);
00290
00291
00292 s64 GetTime();
00293 deBoolean SetTime(s64 Time);
00294
00295
00296 deBoolean GetProperties(deFileProperties *Properties);
00297
00298
00299 long GetOpenFlags();
00300
00301 deBoolean AddPlugin(IdePlugin *Plugin);
00302 deBoolean ReleasePlugin(IdePlugin *Plugin);
00303 deBoolean ReleaseAllPlugins();
00304
00305
00306 deBoolean DefragFile();
00307
00308 private:
00309 IdeFile * priv_BaseFile;
00310 IdeFileSystem * priv_BaseFS;
00311 deBoolean priv_OwnBaseFile;
00312 long priv_CurrentPosition;
00313 long priv_OpenFlags;
00314
00315
00316 typedef struct PluginList
00317 {
00318 IdePlugin * Plugin;
00319 struct PluginList * Next;
00320 struct PluginList * Previous;
00321 } PluginList;
00322
00323
00324 #pragma pack(1)
00325 typedef struct PluginHeader
00326 {
00327 DWORD ID;
00328 DWORD Version;
00329 long DataOffset;
00330 long LastBlockSize;
00331 short EntryCount;
00332 } PluginHeader;
00333 #pragma pack()
00334
00335
00336 typedef struct PluginFileData
00337 {
00338 long RealFilePos;
00339 long Size;
00340 } PluginFileData;
00341
00342
00343 deBoolean GetFileBlock(long ReadBlock);
00344 deBoolean WriteCurrentFileBlock();
00345
00346
00347 void *ApplyPluginEncode(void *Buffer, long *Length);
00348 void *ApplyPluginDecode(void *Buffer, long *Length);
00349
00350 PluginList * priv_PluginList_First;
00351 PluginList * priv_PluginList_Last;
00352 deBoolean priv_PluginLocked;
00353
00354
00355 PluginFileData * priv_FileData;
00356 short priv_FileDataCount;
00357 long priv_LastBlockSize;
00358
00359 deBoolean priv_FileBlockChanged;
00360 void * priv_FileBuffer;
00361 long priv_FileBlock;
00362 };
00363
00364 #endif
00365